﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using ContactManagement.App_GlobalResources;
using EFDataModel;

namespace ContactManagement.Models
{
    /// <summary>
    /// Datenmodell für das Registrieren eines Users
    /// </summary>
    public class RegisterModel
    {
        /// <summary>
        /// UserTitle, bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(Name = "TitleRESX", ResourceType = typeof(AccountViews))]
        public IEnumerable<SelectListItem> UserTitles
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (var eItem in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<UserTitle>())
                {
                    items.Add(new SelectListItem { Value = eItem.ID.ToString(), Text = eItem.Name });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Die Anrede die in der Oberfläche ausgewählt wird (der Value) wird in dieser variable abgelegt, d.h. wenn kein Wert ausgewählt wurde
        /// dann wird auch die hier angegebene Fehlermeldung auf der Oberfläche angezeigt. Wird auch benutzt um die currentselection der Dropdownliste anzuzeigen,
        /// da das Property Selected des SelectedListItem nicht funktioniert!
        /// ACHTUNG der wert darf nicht nur "Title" lauten, da sonst die Validierung nicht geht!
        /// </summary>
        [Required(ErrorMessageResourceName = "NoTitleSelectedRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        [Display(Name = "TitleRESX", ResourceType = typeof(AccountViews))]
        public string UserTitle { get; set; }

        /// <summary>
        /// Der Username Loginname (Email) -> Die Fehler bei der angabe des Remote Controllers und Methode können ignoriert werden.
        /// </summary>
        [Display(Name = "LoginnameRESX", ResourceType = typeof(AccountViews))]
        [Required]
        [StringLength(75)]
        [RegularExpression(WebConstants.EmailRegularExpString, ErrorMessageResourceName = "InvalidEMailAddressRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        [Remote("ValidateUserName", "Account", ErrorMessageResourceName = "UserExistsErrorRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        public string UserName { get; set; }

        [Required]
        [StringLength(50)]
        [Display(Name = "FirstnameRESX", ResourceType = typeof(AccountViews))]
        public string Firstname { get; set; }

        [Required]
        [StringLength(50)]
        [Display(Name = "LastnameRESX", ResourceType = typeof(AccountViews))]
        public string Lastname { get; set; }

        [Required]
        [StringLength(100, ErrorMessageResourceType = typeof(SystemMessages), ErrorMessageResourceName = "PasswordLengthRESX", MinimumLength = WebConstants.PasswordLength)]
        [DataType(DataType.Password)]
        [Display(Name = "PasswordRESX", ResourceType = typeof(AccountViews))]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "ConfirmPasswordRESX", ResourceType = typeof(AccountViews))]
        [Compare("Password", ErrorMessageResourceType = typeof(SystemMessages), ErrorMessageResourceName = "PasswordsDontMatchRESX")]
        public string ConfirmPassword { get; set; }
    }
}